#include <iostream>
using std::cout;
using std::endl;

//抽象类
class Base {
public:
    virtual void print() const{
        cout << "_base:" << _base << endl;
    }
protected:
/* private: */
	Base(int base)
    : _base(base) 
    { cout << "Base()" << endl; }

	int _base;
};

//如果Test对象拥有Base对象作为成员子对象
//不需要两个类之间有继承关系
//但是在Test的构造函数中一定要调用Base的构造函数
//来初始化成员子对象
//
//如果Base只定义了保护属性的构造函数
//则无法在Test中调用Base的这个构造函数
//也就无法初始化成员子对象
//
//所以Base类对象只能作为基类子对象的形式存在
//直接创建或作为成员子对象都不行
//
#if 0
class Test
{
public: 
    Test(int b)
    : _ba(b)
    {}
private: 
    Base _ba;
};
#endif

class Derived
: public Base 
{
public:
	Derived(int base, int derived)
	: Base(base)
	, _derived(derived)
    /* , _b1(derived)//不能作为成员子对象存在 */
	{ cout << "Derived(int,int)" << endl; }
    
	void print() const override
	{
		cout << "_base:" << _base
		<< ", _derived:" << _derived << endl;
	}
private:
	int _derived;
    /* Base _b1; */
};

void test0(){
    /* Base b1(10); */
    Derived d1(3,7);
    Base * pb = &d1;
    pb->print();

}

int main(void){
    test0();
    return 0;
}
